module.exports = (app) => {
  const express = require("express");
  const jwt = require("jsonwebtoken"); // 引入token模块
  const AdminUser = require("../../models/AdminUser"); // 引入用户模块
  const assert = require("http-assert"); // 引入http-assets模块
  const router = express.Router({
    mergeParams: true, // 合并参数，保留来自父路由器的req.params值，如果父对象和子对象有冲突的参数名，则以子对象的值为准
  });

  // const Category = require('../../models/Category') // 改成通用CRUD模板的写的

  // 新增方法接口
  router.post("/", async (req, res) => {
    const model = await req.Model.create(req.body);
    res.send(model); // 返回这个模型
  });

  // 编辑方法接口
  router.put("/:id", async (req, res) => {
    const model = await req.Model.findByIdAndUpdate(req.params.id, req.body);
    res.send(model); // 返回这个模型
  });

  // 获得列表数据
  router.get("/", async (req, res) => {
    const queryOptions = {}; // 查询的参数
    if (req.Model.modelName === "Category") {
      queryOptions.populate = "parent";
    }
    // 动态增加查询的参数
    const items = await req.Model.find().setOptions(queryOptions).limit(10); // 查找返回的结果，限制查找的结果为10条
    res.send(items); // 返回这个模型
  });

  // 获得详情数据
  router.get("/:id", async (req, res) => {
    const model = await req.Model.findById(req.params.id); // 查找返回的结果
    res.send(model); // 返回这个模型
  });

  // 删除数据接口
  router.delete("/:id", async (req, res) => {
    const model = await req.Model.findByIdAndDelete(req.params.id, req.body); // 查找返回的结果
    res.send({
      success: true, // 返回状态
    });
  });

  // 登录校验中间件
  const authMiddleWare = require("../../middleware/auth");

  // 模型中间件
  const modelMiddleWare = require("../../middleware/model");

  app.use(
    "/admin/api/rest/:resource",
    authMiddleWare(),
    modelMiddleWare(),
    router
  ); // 匹配admin开头的接口

  // 上传图片需要npm i multer插件
  const multer = require("multer");
  const upload = multer({ dest: __dirname + "../../../uploads" }); // __dirname：绝对地址
  app.post(
    "/admin/api/upload",
    authMiddleWare(),
    upload.single("file"),
    async (req, res) => {
      const file = req.file;
      file.url = `http://localhost:3000/uploads/${file.filename}`;
      res.send(file); // 返回保存的图片
    }
  );
  // 用户登录方法
  app.post("/admin/api/login", async (req, res) => {
    const { username, password } = req.body; // 将传送过来的数据解构
    // 1、根据用户名找到用户
    const user = await AdminUser.findOne({
      username: username, // 键值对方式查询
    }).select("+password");
    assert(user, 422, "用户不存在");
    // if (!user) {
    //   return res.status(422).send({
    //     message: "用户不存在，请输入正确的用户名", // 将状态码转换为422，并且发送数据
    //   });
    // }
    // 2、校验密码
    // 第一个参数时传送过来的数据 ，第二个参数是数据库的数据
    const isPassword = require("bcryptjs").compareSync(password, user.password);
    assert(isPassword, 422, "密码错误");

    // if (!isPassword) {
    //   return res.status(422).send({
    //     message: "密码错误", // 将状态码转换为422，并且发送数据
    //   });
    // }
    // 3、返回token
    const token = jwt.sign({ id: user._id }, app.get("secret"));
    res.send({ token }); // 返回token值
    /*
        iss:签发人
        iat:签发时间回溯30s
        exp:过期时间 这里可是使用秒数,也可以使用day
        "{"jti":1,"iss":"gumt.top","user":"goolge","iat":1555650413,"exp":1555657613}"
        "iat": ~~(Date.now() / 1000)-30,
        "exp": ~~(Date.now() / 1000)+(60*60),
    */
  });

  // 处理错误函数
  app.use(async (err, req, res, next) => {
    res.status(err.status || 500).send({ message: err.message });
  });
};
